package com.atguigu.realtime.util;

import com.atguigu.realtime.common.Constant;
import net.minidev.json.JSONObject;
import org.apache.commons.beanutils.BeanUtils;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName: MyJDBCUtil
 * @Description:
 * @Author: kele
 * @Date: 2021/4/21 9:54
 **/
public class MyJDBCUtil {

    //获取一个连接
    public static Connection getConnect(String url, String driver) throws SQLException, ClassNotFoundException {


            Connection conn = DriverManager.getConnection(url);

            //设置驱动，mysql在linux上没有问题，其他的jdbc连接可能出现找不到驱动
            Class.forName(driver);
            return conn;
    }
/*

    //执行查询，并将查询结果输出
    public static <T> List<T> getQuery(Connection conn,
                                    String sql,
                                    Object[] args,
                                    Class<T> clzz){

        //将查询放在try的()之内，可以自动关闭连接，（在jdk1.7之后的功能）
        try(PreparedStatement ps = conn.prepareStatement(sql)) {
   //   PreparedStatement ps = conn.prepareStatement(sql);

            for (int i = 0; args != null && i < args.length ; i++) {
                ps.setObject(i+1,args[i]);
            }

            //得到查询的结果集
            ResultSet resultSet = ps.executeQuery();

            //获取元数据，元数据中存储有列的信息，列名之类的
            ResultSetMetaData metaData = resultSet.getMetaData();

            ArrayList<T> list = new ArrayList<>();

            while(resultSet.next()){

                T t = clzz.newInstance(); //创建一个对象

                for (int i = 1; i <= metaData.getColumnCount(); i++) {
                    //列名是从第1开始
                    String columnLabel = metaData.getColumnLabel(i); //获取列名（从phoenix中）
                    Object object = resultSet.getObject(i);          //获取列值

                    */
/*//*
/通过反射的方法对将值传递给T,这种用法必须创建一个对象，否则会出现找不到属性名的错误，不适用于封装为jsonobject的类
                    Field field = clzz.getDeclaredField(columnLabel);  //获取私有的属性
                    field.setAccessible(true);  //暴力破解
                    field.set(t,object);        //给属性赋值*//*


                    //common提供的BeanUtils通过反射的方法给对象的属性赋值
                    BeanUtils.setProperty(t,columnLabel,object);
                }
                list.add(t);
                return list;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
*/

    //执行查询，并将查询结果输出,如果采用捕获异常的方式，会导致异常无法通过客户端查看报错信息
    public static <T> List<T> getQuery(Connection conn,
                                    String sql,
                                    Object[] args,
                                    Class<T> clzz) throws SQLException, IllegalAccessException, InstantiationException, InvocationTargetException {
        PreparedStatement ps = conn.prepareStatement(sql);

        for (int i = 0; args != null && i < args.length ; i++) {
            //在hbase中存储的字段都是varchar类型，所以需要将字段转为string查询
            ps.setObject(i+1,args[i].toString());
        }

        //得到查询的结果集
        ResultSet resultSet = ps.executeQuery();

        //获取元数据，元数据中存储有列的信息，列名之类的
        ResultSetMetaData metaData = resultSet.getMetaData();

        ArrayList<T> list = new ArrayList<>();

        while(resultSet.next()){

            T t = clzz.newInstance(); //创建一个对象

            for (int i = 1; i <= metaData.getColumnCount(); i++) {
                //列名是从第1开始
                String columnLabel = metaData.getColumnLabel(i); //获取列名（从phoenix中）
                Object object = resultSet.getObject(i);          //获取列值

                //common提供的BeanUtils通过反射的方法给对象的属性赋值
                BeanUtils.setProperty(t,columnLabel,object);
            }
            list.add(t);
        }
        return list;
    }




/*        //测试
        public static void main(String[] args) throws SQLException, ClassNotFoundException {
        Connection conn = getConnect(Constant.PHOENIX_URL, Constant.PHOENIX_DRIVER);
        List<JSONObject> json = getQuery(conn, "select SKU_NAME from dim_sku_info where id = '1'", null, JSONObject.class);
        System.out.println(json);
    }*/


}
